/*
 * funcionesUtiles.h
 *
 *  Created on: 26/10/2011
 *      Author: utn_so
 */

#include <sys/socket.h>
#include <sys/types.h>
#include <sys/time.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>
#include <sys/stat.h>
#include <dirent.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/wait.h>
#include <errno.h>
#include <sys/queue.h>
#include <ifaddrs.h>
#include <pthread.h>
#include "../../../Commons/src/includes/nipc.h"
#include "./colasPeticion.h"

#ifndef FUNCIONESUTILES_H_
#define FUNCIONESUTILES_H_

//typedef struct desc_PDD{
//	uint32_t socket;
//	pthread_t hilo;
//	ptrNodo colaFin;
//	ptrNodo colaFte;
//	uint32_t flagSincro; //1 si está sincronizado, 0 si no lo está
//	char identificador[25];
//}desc_PDD;

typedef struct paramThread{
	uint32_t socket;
	nodo_t *colaFte;
	nodo_t *colaFin;
}paramThread;

typedef struct escritura{
	uint32_t numSector;
	char mensaje[512];
}escritura_t;


uint32_t esPDD(uint32_t socket,desc_PDD_t *vector_PDD,uint32_t limite);
uint32_t recibirCabecera(uint32_t socket,paqueteNIPC *cabecera);
uint32_t analizarTipo(uint32_t plength);
void armarCabecera(uint32_t num_msg,long longitud,paqueteNIPC* cabecera);
void quitarElementoDeVector(uint32_t elem,desc_PDD_t *vec,uint32_t n);
void inicializarVectorPDDs(desc_PDD_t *vec, uint32_t n);

uint32_t pedirLecturaSockete(uint32_t socket, uint32_t numSector, paqueteNIPC paquete, uint32_t socket_PFS);
uint32_t pedirEscrituraSockete(uint32_t socket, uint32_t numSector, char mensaje[512], uint32_t longMsj,uint32_t socket_PFS);

void tomarPeticion(desc_PDD_t *param);

uint32_t pedirLecturaSocketePanicso(uint32_t socket, uint32_t numSector, paqueteNIPC paquete);
uint32_t pedirEscrituraSocketePanicso(uint32_t socket, uint32_t numSector, char mensaje[512], uint32_t longMsj);

uint32_t encolarParaEscrituraSincro(desc_PDD_t* noUsa, uint32_t cant_PDD, payloadEscritura_t payloadEscritura, uint32_t lonPay, uint32_t discoSincro);
uint32_t otorgarPeticionDiscoSincro(uint32_t sector, uint32_t cantDiscos, uint32_t sectoresPorDisco, desc_PDD_t *vec);

void sincronizar(sincro_t *param);

#endif /* FUNCIONESUTILES_H_ */
